import java.io.File;
import java.io.IOException;
import java.io.Serializable;
import java.util.Scanner;
import java.lang.reflect.Field;

public class GameData implements Serializable {
	int L, H, W, currentLevel; // 地图的层数、高度、宽度和当前层级
	int pX, pY, heroHealth, keyNum; // 英雄的X坐标、Y坐标、健康值和钥匙数量
	int[][][] map; // 三维数组表示地图

	// 从文件中读取地图数据
	void readMapFromFile(String filePath) {
		currentLevel = 0; // 初始化当前层级为0
		heroHealth = 105; // 初始化英雄健康值为105
		keyNum = 0; // 初始化钥匙数量为0
		pX = 3; // 初始化英雄X坐标为3
		pY = 3; // 初始化英雄Y坐标为3
		try {
			Scanner in = new Scanner(new File(filePath)); // 创建文件扫描器
			L = in.nextInt(); // 读取地图层数
			H = in.nextInt(); // 读取地图高度
			W = in.nextInt(); // 读取地图宽度
			map = new int[L][H][W]; // 初始化地图数组
			for (int i = 0; i < L; i++) // 遍历每一层
				for (int j = 0; j < H; j++) // 遍历每一行
					for (int k = 0; k < W; k++) // 遍历每一列
						map[i][j][k] = in.nextInt(); // 读取地图数据
		} catch (IOException e) {
			System.out.println("Error with files:" + e.toString()); // 捕获并打印文件读取错误
		}
	}

	// 打印当前层级的地图
	void printMap() {
		char C[] = { 'W', '_', 'K', 'D', 'S', 'E', 'H' }; // 地图元素的字符表示
		for (int j = 0; j < H; j++) { // 遍历每一行
			for (int k = 0; k < W; k++) { // 遍历每一列
				if (map[currentLevel][j][k] < 0) // 如果地图值小于0，表示怪物
					System.out.print("M ");
				else if (map[currentLevel][j][k] > 10) // 如果地图值大于10，表示玩家
					System.out.print("P ");
				else
					System.out.print(C[map[currentLevel][j][k]] + " "); // 打印对应的字符
			}
			System.out.print("\n\n"); // 换行
		}
		System.out.print(
				"Health:" + Integer.toString(heroHealth) + "  KeyNum:" + Integer.toString(keyNum) + "  Menu:press 0\n"); // 打印英雄状态和菜单提示
	}

	// 复制对象的字段值
	void copyFields(Object source) {
		try {
			Class<?> clazz = this.getClass(); // 获取当前类的Class对象
			Field[] fields = clazz.getDeclaredFields(); // 获取所有字段
			for (Field field : fields) {
				field.setAccessible(true); // 设置字段可访问
				Object value = field.get(source); // 获取源对象的字段值
				field.set(this, value); // 设置当前对象的字段值
			}
		} catch (IllegalAccessException e) {
			e.printStackTrace(); // 捕获并打印非法访问异常
		}
	}
}
